/**
 * api.js - RESTful API 接口封装层
 * 统一管理所有后端接口调用，提供类型安全的请求方法
 */

const API = {
    /**
     * 用户登录接口
     * @param {Object} data - 登录信息对象
     * @param {string} data.loginName - 登录名
     * @param {string} data.password - 登录密码
     * @returns {Promise<Object>} 响应对象 { code: number, message: string, data: string }
     */
    login: (data) => {
        return fetch('/login', {
            method: 'POST',
            headers: {'Content-Type': 'application/json'},
            body: JSON.stringify(data)
        }).then(res => res.json());
    },

    /**
     * 添加新的数据源配置
     * @param {Object} data - 数据源配置对象
     * @param {string} data.dbType - 数据库类型（mysql | sqlserver | postgresql | kingbase）
     * @param {string} data.host - 主机IP地址
     * @param {number} data.port - 端口号
     * @param {string} data.username - 数据库用户名
     * @param {string} data.password - 数据库密码
     * @returns {Promise<Object>} 响应对象 { code: number, message: string, data: any }
     */
    addDataSource: (data) => {
        return fetch('/dbConnect/add', {
            method: 'POST',
            headers: {'Content-Type': 'application/json'},
            body: JSON.stringify(data)
        }).then(res => res.json());
    },

    /**
     * 获取所有已配置的数据源列表
     * @returns {Promise<Object>} 响应对象，data字段为数据源数组
     * data: [{ id, dbType, host, port, username }]
     */
    getDataSourceList: () => {
        return fetch('/dbConnect/dbUrl').then(res => res.json());
    },

    /**
     * 删除指定ID的数据源
     * @param {number} id - 数据源ID
     * @returns {Promise<Object>} 响应对象 { code: 200|500, message: string }
     */
    deleteDataSource: (id) => {
        return fetch(`/dbConnect/delete/${id}`).then(res => res.json());
    },

    /**
     * 获取可用于ES导入的数据源下拉列表
     * （通常与getDataSourceList返回内容一致）
     * @returns {Promise<Object>} 响应对象，data字段为数据源数组
     */
    getDbUrlList: () => {
        return fetch('/import/dbUrl').then(res => res.json());
    },

    /**
     * 根据数据源ID查询该数据源下的所有数据库名称
     * @param {Object} dto - 请求参数
     * @param {number} dto.dbId - 数据源ID
     * @returns {Promise<Object>} 响应对象，data字段为数据库名称字符串数组
     */
    getDatabases: (dto) => {
        return fetch('/import/databases', {
            method: 'POST',
            headers: {'Content-Type': 'application/json'},
            body: JSON.stringify(dto)
        }).then(res => res.json());
    },

    /**
     * 根据数据源ID和数据库名，查询该数据库下的所有表名
     * @param {Object} dto - 请求参数
     * @param {number} dto.dbId - 数据源ID
     * @param {string} dto.dbName - 数据库名称
     * @returns {Promise<Object>} 响应对象，data字段为表名字符串数组
     */
    getTables: (dto) => {
        return fetch('/import/tables', {
            method: 'POST',
            headers: {'Content-Type': 'application/json'},
            body: JSON.stringify(dto)
        }).then(res => res.json());
    },

    /**
     * 提交数据导入Elasticsearch任务
     * @param {Object} dto - 导入任务参数
     * @param {number} dto.dbId - 数据源ID
     * @param {string} dto.dbName - 数据库名称
     * @param {string} dto.tableName - 表名
     * @param {string|null} [dto.condition] - 可选的SQL WHERE条件（如 "id > 100"）
     * @param {string|null} [dto.indexName] - 可选的目标ES索引名（为空则自动生成）
     * @param {string|null} [dto.indexRuleName] - 可选的索引规则名称
     * @returns {Promise<Object>} 响应对象
     *   成功时: { code: 200, data: batchNo(批次号字符串) }
     *   失败时: { code: 500, message: 错误信息 }
     */
    importEs: (dto) => {
        return fetch('/import/importEs', {
            method: 'POST',
            headers: {'Content-Type': 'application/json'},
            body: JSON.stringify(dto)
        }).then(res => res.json());
    },

    /**
     * 根据批次号查询导入任务进度
     * @param {string} batchNo - 任务批次号
     * @returns {Promise<Object>} 响应对象
     *   data: {
     *     totalCount: number,    // 总数据量
     *     finishCount: number,   // 已完成数量
     *     state: number,         // 状态：0=进行中, 1=已完成, 2=失败
     *     msg: string           // 消息（成功提示或错误详情）
     *   }
     */
    getImportProgress: (batchNo) => {
        return fetch(`/import/schedule/${encodeURIComponent(batchNo)}`)
            .then(res => res.json());
    },

    /**
     * 懒加载获取文件树节点
     * @param {string} fullPath - 文件夹路径，根路径传空字符串
     * @param {string} nameFilter - 可选的文件名过滤条件
     * @returns {Promise<Object>} 响应对象
     *   data: TreeNode[] - 文件/文件夹节点数组
     *   TreeNode: {
     *     name: string,           // 节点名称
     *     fullPath: string,       // 完整路径
     *     directory: boolean,     // 是否为目录
     *     size: number,           // 文件大小（字节）
     *     formattedSize: string,  // 格式化后的大小
     *     lastModified: string,   // 最后修改时间
     *     extension: string,      // 文件扩展名
     *     hasChildren: boolean    // 是否有子节点
     *   }
     */
    lazyLoadFile: (fullPath = '', nameFilter = '') => {
        let url = `/file/lazyLoadFile?fullPath=${encodeURIComponent(fullPath)}`;
        if (nameFilter) {
            url += `&nameFilter=${encodeURIComponent(nameFilter)}`;
        }
        return fetch(url).then(res => res.json());
    },

    /**
     * 上传文件到服务器
     * @param {FormData} formData - 包含文件和前置路径的表单数据
     *   formData.append('file', file) - 必需，文件对象
     *   formData.append('prefix', prefix) - 可选，子目录路径
     * @returns {Promise<Object>} 响应对象
     *   成功时: { code: 200, data: FileIndex对象 }
     *   失败时: { code: 500, message: 错误信息 }
     */
    uploadFile: (formData) => {
        return fetch('/file/uploadFile', {
            method: 'POST',
            body: formData
            // 注意：使用FormData时不要设置Content-Type，浏览器会自动设置
        }).then(res => res.json());
    },

    /**
     * 获取文件流内容
     * @param {string} fileName - 文件路径名称
     * @returns {Promise<Response>} 原始Response对象，需调用者处理
     *   可用方法: .text(), .json(), .blob() 等
     */
    getFileStream: (fileName) => {
        return fetch(`/file/getFileStream?fileName=${encodeURIComponent(fileName)}`);
    }
};